package org.feng.common;

import lombok.AllArgsConstructor;
import lombok.Getter;
import org.feng.sensitive.AbstractSensitive;
import org.feng.util.SensitiveUtil;

import java.util.Objects;

/**
 * 敏感数据类型
 *
 * @version v1.0
 * @author: fengjinsong
 * @date: 2023年08月26日 00时20分
 */
@Getter
@AllArgsConstructor
public enum SensitiveDataTypeEnum {
    /**
     * 手机类型
     */
    PHONE() {
        @Override
        String doSensitive(String originalData) {
            return SensitiveUtil.maskedPhone(originalData);
        }
    },

    /**
     * 身份证
     */
    ID_CARD,

    /**
     * 邮箱
     */
    EMAIL() {
        @Override
        String doSensitive(String originalData) {
            return SensitiveUtil.maskedEmail(originalData);
        }
    },
    /**
     * 银行卡
     */
    BANK_CARD,
    /**
     * 地址
     */
    ADDRESS,
    /**
     * 自定义其他
     */
    CUSTOM;

    /**
     * 脱敏数据
     *
     * @param originalData 原数据
     * @return 脱敏后的数据
     */
    String doSensitive(String originalData) {
        throw new RuntimeException(this.name() + " 暂不支持脱敏数据");
    }

    String decrypt(String encryptData, String sensitiveType) {
        AbstractSensitive sensitive = AbstractSensitive.getSensitiveByType(sensitiveType);
        if (Objects.isNull(sensitive)) {
            return encryptData;
        }
        return sensitive.decrypt(encryptData);
    }

    /**
     * 解密数据并脱敏
     *
     * @param encryptData   密文数据
     * @param sensitiveType 加密类型
     * @return 解密并脱敏后的数据
     */
    String doDecryptAndMaskedField(String encryptData, String sensitiveType) {
        String decryptText = decrypt(encryptData, sensitiveType);
        return doSensitive(decryptText);
    }
}
